﻿using Sinacor.Infra.Common.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Clientes.Presenter
{
    /// <summary>
    /// Presenter de CadastroErroExportacaoComitente
    /// </summary>
    public class CadastroErroExportacaoComitente : BasePresenter<ICadastroErroExportacaoComitente>
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="view">View</param>
        public CadastroErroExportacaoComitente(ICadastroErroExportacaoComitente view)
            : base(view)
        {
            this._communicationErroExportacaoComitente = new Communication.DicionarioErroExportacaoComitente(this.Session);

            // Inicializando models
            this.ListaErroExportacao = new ModelCollection<Model.ErroExportacaoComitente>();
        }

        #endregion

        #region Variáveis Privadas

        private Communication.DicionarioErroExportacaoComitente _communicationErroExportacaoComitente;
        private ModelCollection<Model.ErroExportacaoComitente> _listaErroExportacao;
        //private ModelCollection<Model.Parameter.FiltroErroExportacaoComitenteChave> _listaFiltroErroExportacaoComitenteChave;

        #endregion

        #region Propriedades

        /// <summary>
        /// Parametros de ListaErroExportacao
        /// </summary>
        public ModelCollection<Model.ErroExportacaoComitente> ListaErroExportacao
        {
            get { return this._listaErroExportacao; }
            set
            {
                this._listaErroExportacao = value;
                if (_listaErroExportacao != null)
                    this.ListaErroExportacao.EnableStateControl = true;
            }
        }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Realiza consulta de Erros de Exportação
        /// </summary>
        public void ConsultarErrosExportacoesComitentes()
        {
            try
            {
                this.ListaErroExportacao = this._communicationErroExportacaoComitente.ConsultarErrosExportacoesComitentes
                    (
                        new Model.Parameter.FiltroErroExportacaoComitente
                                    {
                                        Codigo = null,
                                        Descricao = null
                                    }
                                );

                if (this.ListaErroExportacao == null || this.ListaErroExportacao.Count == 0)
                {
                    this.View.InformarNenhumRegistroEncontrado();
                }
                else
                {
                    this.View.AtualizarErrosExportacaoComitente();
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }

        /// <summary>
        /// Inicializa a presenter
        /// </summary>
        public void Inicializar()
        {
            this.ConsultarErrosExportacoesComitentes();
        }

        /// <summary>
        /// Realiza a execução dos ítens a serem Incluídos, Excluídos e Atualizados
        /// </summary>
        public bool Salvar()
        {
            bool isOk = false;
            try
            {
                ModelCollection<Model.Parameter.FiltroErroExportacaoComitenteChave> listaFiltroErroExportacaoComitenteChave = new ModelCollection<Model.Parameter.FiltroErroExportacaoComitenteChave>();

                ModelCollection<Model.ErroExportacaoComitente> insertedList = this.ListaErroExportacao.GetInserted();

                foreach (Model.ErroExportacaoComitente item in this.ListaErroExportacao.GetDeleted())
                {
                    listaFiltroErroExportacaoComitenteChave.Add
                        (
                            new Model.Parameter.FiltroErroExportacaoComitenteChave() { Codigo = item.Codigo.Value }
                        );
                }

                ModelCollection<Model.ErroExportacaoComitente> updatedList = this.ListaErroExportacao.GetUpdated();

                this._communicationErroExportacaoComitente.ExecutarTransacoes(insertedList, listaFiltroErroExportacaoComitenteChave, updatedList);

                if (insertedList != null && insertedList.Count > 0)
                {
                    isOk = true;
                }

                if (listaFiltroErroExportacaoComitenteChave != null && listaFiltroErroExportacaoComitenteChave.Count > 0)
                {
                    isOk = true;
                }

                if (updatedList != null && updatedList.Count > 0)
                {
                    isOk = true;
                }

                if (isOk)
                {
                    this.View.InformarOperacaoSucesso();
                }

            }
            catch (BusinessException ex) 
            {
                if (ex.ErrorNumber == 109355)
                {
                    base.HandleException(ex);
                    this.View.InformarLinhaMesmoCodigo();
                    return false;
                }
                if (ex.ErrorNumber == 109356)
                {
                    base.HandleException(ex);
                    this.View.InformarLinhaMesmaDescricao();
                    return false;
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return false;
            }

            return true;
        }

        #endregion
    }
}
